package cn.tedu.user.controller;

import cn.tedu.user.service.UserService;
import com.jt.common.pojo.User;
import com.jt.common.utils.CookieUtils;
import com.jt.common.vo.SysResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@RestController
@RequestMapping("/user/manage")
public class UserController {
    @Autowired
    UserService us;

    @RequestMapping("/checkUserName")
    public SysResult checkUserName(String userName) {
        return us.checkUserName(userName);
    }

    /**
     * 表单提交，新增
     */
    @RequestMapping("/save")
    public SysResult saveUser(User user) {
        // 判断新增成功与失败
        try {
            us.saveUser(user);
            return SysResult.ok();
        } catch (Exception e) {
            e.printStackTrace();
            return SysResult.build(201, "注册失败", null);
        }
    }

    @RequestMapping("login")
    public SysResult doLogin(User user, HttpServletRequest req, HttpServletResponse res) {
        try {
            // 判断 业务层返回数据，是否生成了存储在redis中的key值 ticket
            String ticket = us.doLogin(user);
            if ("".equals(ticket) || ticket == null) {
                // 说明业务层没有存储redis，说明用户名密码不正确
                // 登录失败
                return SysResult.build(201, "登录失败", null);
            } else {
                // 正确存储到redis，登录成功，在控制层使用cookie技术，将返回ticket值回给浏览器，浏览器客户端才能在登录之后，有了一张类似票的概念的数据


                // 后续访问系统只要判断这张票是否合法，是否超时
                // 调用common-resources CookieUtils
                // 其中set方法需要request和response对象
                CookieUtils.setCookie(req, res, "EM_TICKET", ticket);
                // 返回数据，告诉ajax登录成功
                return SysResult.ok();
            }
        } catch (Exception e) {
            e.printStackTrace();
            return SysResult.build(201, "登录失败", null);
        }
    }

    /**
     * 获取用户登录后存储在redis中的数据
     * @param ticket
     * @return
     */
    @RequestMapping("/query/{ticket}")
    public SysResult queryUserData(@PathVariable String ticket) {
        // 调用业务层，执行redis链接获取数据逻辑
        String userJson = us.queryUserData(ticket);
        // 有ticket就一定去得到数据吗？不一定，有可能登录状态超时了
        if (userJson == null) {
            // 有ticket，但是redis没有userJson说明确实登录过，但是超时了
            // 返回201，不携带任何数据 data
            return SysResult.build(201, "登录可能超时", null);
        } else {
            // ticket也有登录过，userJson也表示没有超时，登录状态是正常使用的
            return SysResult.build(200, "登录可用", userJson);
        }
    }

    /**
     * 登出
     * 删除cookie
     * 删除redis中存储的数据, 可以省略代码不删除数据, redis的数据具有超时配置
     * 但是只删除cookie不删除redis数据，有可能就会造成redis短时间内数据的猛增
     * @return
     */
    @RequestMapping("/logout")
    public SysResult doLogout(HttpServletRequest req, HttpServletResponse res) {
        try {
            String ticket = CookieUtils.getCookieValue(req, "EM_TICKET");
            // 删除redis数据
            if (ticket != null && !ticket.isEmpty())
                us.clearRedis(ticket);
            CookieUtils.deleteCookie(req, res, "EM_TICKET");
        } catch (Exception e) {
            return SysResult.build(201, "登出失败", null);
        }
        return SysResult.ok();
    }

}
